/**
 * LLM客户端工具类
 * 封装通义千问API调用
 */
const OpenAI = require('openai');
const config = require('../config');
const { log } = require('../middleware/logger');

class LLMClient {
  constructor() {
    // 初始化OpenAI客户端，使用通义千问的兼容接口
    this.client = new OpenAI({
      apiKey: config.qwen.apiKey,
      baseURL: config.qwen.baseURL
    });
    
    this.model = config.qwen.model;
    log.info('LLM客户端初始化完成', { model: this.model, baseURL: config.qwen.baseURL });
  }

  /**
   * 发送聊天消息
   * @param {Array} messages - 消息历史数组
   * @param {Object} options - 可选参数
   * @returns {Promise<Object>} 响应结果
   */
  async chat(messages, options = {}) {
    try {
      const {
        stream = false,
        temperature = 0.7,
        maxTokens = 2000,
        tools = null,
        toolChoice = 'auto'
      } = options;

      const requestParams = {
        model: this.model,
        messages,
        temperature,
        max_tokens: maxTokens,
        stream
      };

      // 如果提供了工具，添加工具调用配置
      if (tools && tools.length > 0) {
        requestParams.tools = tools;
        requestParams.tool_choice = toolChoice;
      }

      log.debug('发送LLM请求', { 
        messageCount: messages.length, 
        stream, 
        hasTools: !!tools 
      });

      const response = await this.client.chat.completions.create(requestParams);
      
      log.debug('收到LLM响应', { 
        hasChoices: !!response.choices?.length,
        finishReason: response.choices?.[0]?.finish_reason
      });

      return response;
    } catch (error) {
      log.error('LLM请求失败', error);
      throw new Error(`LLM服务调用失败: ${error.message}`);
    }
  }

  /**
   * 流式聊天
   * @param {Array} messages - 消息历史数组
   * @param {Object} options - 可选参数
   * @returns {Promise<AsyncIterable>} 流式响应
   */
  async chatStream(messages, options = {}) {
    try {
      const {
        temperature = 0.7,
        maxTokens = 2000,
        tools = null,
        toolChoice = 'auto'
      } = options;

      const requestParams = {
        model: this.model,
        messages,
        temperature,
        max_tokens: maxTokens,
        stream: true
      };

      // 如果提供了工具，添加工具调用配置
      if (tools && tools.length > 0) {
        requestParams.tools = tools;
        requestParams.tool_choice = toolChoice;
      }

      log.debug('发送LLM流式请求', { 
        messageCount: messages.length,
        hasTools: !!tools 
      });

      const stream = await this.client.chat.completions.create(requestParams);
      
      return stream;
    } catch (error) {
      log.error('LLM流式请求失败', error);
      throw new Error(`LLM流式服务调用失败: ${error.message}`);
    }
  }

  /**
   * 构建系统提示词
   * @param {string} userIntent - 用户意图
   * @param {Array} availableTools - 可用工具列表
   * @returns {string} 系统提示词
   */
  buildSystemPrompt(userIntent = '', availableTools = []) {
    const toolsDescription = availableTools.length > 0 
      ? `\n\n可用工具:\n${availableTools.map(tool => `- ${tool.name}: ${tool.description}`).join('\n')}`
      : '';

    return `你是一个智能的旅游出行助手，专门帮助用户规划旅行、查询交通信息、获取天气预报等。

你的能力包括：
1. 火车票查询 - 帮助用户查询火车班次、票价等信息
2. 路线规划 - 提供出行路线建议，包括步行、驾车、公交等方式
3. 天气查询 - 查询指定城市的天气情况和预报
4. 旅行建议 - 根据用户需求提供个性化的旅行建议

请用友好、专业的语气与用户交流，提供准确、有用的信息。当需要调用工具时，请合理选择并正确使用。${toolsDescription}

当前用户意图: ${userIntent || '未明确'}`;
  }

  /**
   * 解析工具调用结果
   * @param {Object} toolCall - 工具调用对象
   * @param {string} result - 工具执行结果
   * @returns {Object} 格式化的工具结果
   */
  formatToolResult(toolCall, result) {
    return {
      tool_call_id: toolCall.id,
      role: 'tool',
      name: toolCall.function.name,
      content: typeof result === 'string' ? result : JSON.stringify(result)
    };
  }
}

// 创建单例实例
const llmClient = new LLMClient();

module.exports = llmClient;